package modele;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.Vector;

public class Groupe extends FormeGeometrique implements Serializable {

	private Vector<FormeGeometrique> lesFormes; // agregat

	public Groupe() {
		lesFormes = new Vector<FormeGeometrique>();
	}

	// public Groupe(Vector<FormeGeometrique> parametre) {
	// this.elements = parametre;
	// }

	// on fait un agregat donc les objets qu'on ajoute : on en fait une copie
	// ici on utilise createClone sur [e] bien qu'on ne sache pas ce que [e] va etre a l'execution : c'est du polymorphisme
	public void addForme(FormeGeometrique e) {
		lesFormes.addElement(e.createClone());
	} //ici il faut voir si en fait.... il faudrait pas avoir un agregat faible et donc
	//pas de clone...
	
	public void removeForme(FormeGeometrique e) {
		lesFormes.removeElement(e);
	}
	
	public Vector<FormeGeometrique> getlesFormes(){
		return this.lesFormes;
	}

	@Override
	public FormeGeometrique createClone() {
		Groupe res = new Groupe();
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			res.addForme(e.nextElement().createClone());
		}
		return res;
	}

	@Override
	public FormeGeometrique createSymetrieO(Point origine) {
		Groupe res = new Groupe();
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			res.addForme(e.nextElement().createSymetrieO(origine));
		}
		return res;
	}
	
	@Override
	public FormeGeometrique createSymetrieX(Point origine) {
		Groupe res = new Groupe();
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			res.addForme(e.nextElement().createSymetrieX(origine));
		}
		return res;
	}
	
	@Override
	public FormeGeometrique createSymetrieY(Point origine) {
		Groupe res = new Groupe();
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			res.addForme(e.nextElement().createSymetrieY(origine));
		}
		return res;
	}
	
	

	@Override
	public boolean equals(FormeGeometrique o) {
			boolean egal = true;
			if (o instanceof Groupe){
				Groupe g = (Groupe)o;
				if (g.lesFormes.size() == this.lesFormes.size()){
					Enumeration<FormeGeometrique> e1 = this.lesFormes.elements(); 
					Enumeration<FormeGeometrique> e2 = g.lesFormes.elements();
					while(e1.hasMoreElements() && egal){
						FormeGeometrique f1 = e1.nextElement();
						FormeGeometrique f2 = e2.nextElement();
						egal = f1.equals(f2); //ici on ne sait pas quel equals est appelé : polymorphisme
					}
				}
				else egal = false;
			}
			else egal = false;
			return egal;
	}

	@Override

		public double perimetre() {
			double perim = 0;
				Enumeration<FormeGeometrique> e = lesFormes.elements();
				while (e.hasMoreElements()) {
					perim = perim + e.nextElement().perimetre();
				}
			
			return perim;
		}

	@Override
	public	double surface() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public	void symetrieO(Point origine) {
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			e.nextElement().symetrieO(origine);
		}	

	}

	@Override
	public	void symetrieX(Point origine) {
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			e.nextElement().symetrieX(origine);
		}	
	}

	@Override
	public	void symetrieY(Point origine) {
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			e.nextElement().symetrieY(origine);
		}	

	}

	

	

	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("(((");
		for(FormeGeometrique f : lesFormes)
			sb.append(f);
		return sb.toString();
	}
	
	@Override
	public void switchSelected(){
		super.switchSelected();
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			FormeGeometrique item = e.nextElement();
			item.switchSelected();
		}
	}

	@Override
	public void deplacer(Point depart, Point destination) {
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			 e.nextElement().deplacer(depart, destination);
		}
		
	}

	@Override
	public boolean isOnTheClick(Point clic) {
		boolean trouve = false;
		Enumeration<FormeGeometrique> e = lesFormes.elements();
		while (e.hasMoreElements()) {
			 if (e.nextElement().isOnTheClick(clic)) trouve = true;;
		}
		return trouve;
	}

}
